package top.tagao.m03_beHavioralPatterns.b_12_Iterator;

import top.tagao.m03_beHavioralPatterns.b_12_Iterator.profile.Profile;
import top.tagao.m03_beHavioralPatterns.b_12_Iterator.social_networks.Facebook;
import top.tagao.m03_beHavioralPatterns.b_12_Iterator.social_networks.LinkedIn;
import top.tagao.m03_beHavioralPatterns.b_12_Iterator.spammer.SocialSpammer;

import java.util.ArrayList;
import java.util.List;

/**
 * @author Viktor_Liu
 * @Date 2022/8/14 23:33
 * 1. 迭代器（Iterator）接口声明了遍历集合所需的操作：获取下
 * 一个元素、获取当前位置和重新开始迭代等。
 *
 * 2. 具体迭代器（Concrete Iterators）实现遍历集合的一种特定
 * 算法。迭代器对象必须跟踪自身遍历的进度。这使得多个迭
 * 代器可以相互独立地遍历同一集合。
 *
 * 3. 集合（Collection）接口声明一个或多个方法来获取与集合兼
 * 容的迭代器。请注意，返回方法的类型必须被声明为迭代器
 * 接口，因此具体集合可以返回各种不同种类的迭代器。
 *
 * 4. 具体集合（Concrete Collections）会在客户端请求迭代器时
 * 返回一个特定的具体迭代器类实体。你可能会琢磨，剩下的
 * 集合代码在什么地方呢？不用担心，它也会在同一个类中。
 * 只是这些细节对于实际模式来说并不重要，所以我们将其省略了而已。
 */
public class Main {
    public static void main(String[] args) {
        LinkedIn linkedIn = new LinkedIn(createTestProfiles());
        SocialSpammer socialSpammer = new SocialSpammer(linkedIn);
        socialSpammer.sendSpamToCoworkers("anna.smith@bing.com",
                "Hey! This is Anna's friend Josh. Can you do me a favor and like this post [link]?");
        socialSpammer.sendSpamToFriends("anna.smith@bing.com",
                "Hey! This is Anna's boss Jason. Anna told me you would be interested in [link].");

    }

    public static List<Profile> createTestProfiles() {
        List<Profile> data = new ArrayList<Profile>();
        data.add(new Profile("anna.smith@bing.com", "Anna Smith", "friends:mad_max@ya.com", "friends:catwoman@yahoo.com", "coworkers:sam@amazon.com"));
        data.add(new Profile("mad_max@ya.com", "Maximilian", "friends:anna.smith@bing.com", "coworkers:sam@amazon.com"));
        data.add(new Profile("bill@microsoft.eu", "Billie", "coworkers:avanger@ukr.net"));
        data.add(new Profile("avanger@ukr.net", "John Day", "coworkers:bill@microsoft.eu"));
        data.add(new Profile("sam@amazon.com", "Sam Kitting", "coworkers:anna.smith@bing.com", "coworkers:mad_max@ya.com", "friends:catwoman@yahoo.com"));
        data.add(new Profile("catwoman@yahoo.com", "Liza", "friends:anna.smith@bing.com", "friends:sam@amazon.com"));
        return data;
    }
}
